package cn.good.yan;

import cn.good.yan.entity.User;
import cn.good.yan.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 读写分离的测试
 * 引用：application1.properties 配置文件
 *
 * @author shengren.yan
 * @create 2024/11/30
 */
@SpringBootTest
public class ReadWriteTest1 {

    @Autowired
    private UserMapper userMapper;


    /**
     * 读写分离：写入数据的测试
     * 写操作：自动操作的数据库是：master，写到主库中，然后主库配置主从配置，主库数据复制到从库中。
     * 会打印2条SQL 语句：Logic SQL（逻辑SQL） - Actual SQL（具体操作的库）
     */
    @Test
    public void testInsert() {
        User user = new User();
        user.setUname("张三丰");
        userMapper.insert(user);
    }


    /**
     * 读写分离：事务测试
     * 如果带事务，写操作，master库，然后读操作，也会是：master库
     */
    @Transactional//开启事务
    @Test
    public void testTrans() {
        // 先查询：1条数据（因库里有1条）
        List<User> users = userMapper.selectList(null);

        // 新增一条数据
        User user = new User();
        user.setUname("铁锤");
        userMapper.insert(user);

        // 再查询，有2条数据（都读主库）
        List<User> users2 = userMapper.selectList(null);
        System.out.println(users2);
    }


    /**
     * 读写分离：负载均衡测试
     * 读操作，走从库。
     */
    @Test
    public void testSelectAll() {
        List<User> users1 = userMapper.selectList(null);
        System.out.println(users1);
        List<User> users2 = userMapper.selectList(null);
        System.out.println(users2);
        List<User> users3 = userMapper.selectList(null);
        System.out.println(users3);
        List<User> users4 = userMapper.selectList(null);
        System.out.println(users4);
//        users.forEach(System.out::println);
    }

}
